/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package satk.database;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import satk.beans.interfaces.IntControlManagerDB;
import satk.objetos.Cinta;
import satk.objetos.Categoria;
import satk.objetos.Inscripcion;

/**
 *
 * @author Base
 */
public class ManagerInscripcion extends DBManager
        implements IntControlManagerDB<Inscripcion> {

    private boolean externalCnn = false;
    private Integer identificadorEvento;

    public ManagerInscripcion(int idEvento, java.sql.Connection c) {
        super(c);
        this.externalCnn = true;
        this.identificadorEvento = idEvento;
    }

    public ManagerInscripcion(int idEvento) {
        super();
        this.identificadorEvento = idEvento;
    }

    public List<Categoria> getCategoriasEvento() {
        String query = "SELECT C.idc_categoria, CC.nomc_categoria, CC.sigc_categoria FROM categoria AS C "
                + "JOIN c_categoria AS CC ON (C.idc_categoria = CC.idc_categoria) "
                + "WHERE (id_evento=?) GROUP BY CC.nomc_categoria;";
        Prepare p = new Prepare(1);
        p.add(identificadorEvento, Types.INTEGER);
        List<Categoria> lista = new LinkedList<Categoria>();
        try {
            ResultSet r = select(query, p);
            while (r.next()) {
                int identifica = r.getInt("idc_categoria");
                String nom = r.getString("nomc_categoria");
                String sigla = r.getString("sigc_categoria");
                lista.add(new Categoria(identifica, nom, sigla));
            }
        } catch (Exception ex) {
            Logger.getLogger(ManagerInscripcion.class.getName()).log(Level.SEVERE,
                    "Error al obtener las categorias para la inscripcion", ex);
        } finally {
            if (!externalCnn) {
                this.closeConexion();
            }
        }
        return lista;
    }

    public List<Cinta> getCintasEvento(int idCategoria) {
        String query = "SELECT C.idc_cinta, CC.colc_cinta FROM categoria AS C "
                + "JOIN c_cinta AS CC ON (C.idc_cinta = CC.idc_cinta) "
                + "WHERE (id_evento = ?) AND (C.idc_categoria = ?) GROUP BY CC.colc_cinta;";
        Prepare p = new Prepare(2);
        p.add(identificadorEvento, Types.INTEGER);
        p.add(idCategoria, Types.INTEGER);
        List<Cinta> lista = new LinkedList<Cinta>();

        try {
            ResultSet r = select(query, p);
            while (r.next()) {
                int identifica = r.getInt("idc_cinta");
                String color = r.getString("colc_cinta");
                lista.add(new Cinta(identifica, color));
            }
        } catch (Exception ex) {
            Logger.getLogger(ManagerInscripcion.class.getName()).log(Level.SEVERE,
                    "Error al obtener las Cintas del evento para la inscripcion", ex);
        } finally {
            if (!externalCnn) {
                this.closeConexion();
            }
        }
        return lista;
    }

//    public java.util.Map<String, Boolean> getActiveModalidad(int idCategoria, int idCinta) {
//    }
    @Override
    public List<Inscripcion> getAll() {
        LinkedList<Inscripcion> list = null;
        String query = "SELECT * FROM inscripcion_competencia "
                + "NATURAL JOIN persona, c_institucion, categoria, c_categoria, c_cinta, c_peso "
                + "WHERE (categoria_id_evento=?) "
                + "ORDER BY nomc_institucion ASC;";
        try {
            Prepare prepare = new Prepare(1);
            prepare.add(identificadorEvento, Types.INTEGER);
            ResultSet r = this.select(query, prepare);
            list = new LinkedList<Inscripcion>();
            while (r.next()) {

                Inscripcion ins = new Inscripcion();

                //Datos de la inscripcion
                int identificador = r.getInt("id_inscripcion");
                int kai = r.getInt("kai_inscripcion");
                int kua = r.getInt("kua_inscripcion");
                boolean kaib = false;
                boolean kuab = false;
                if (kai == 1) {
                    kaib = true;
                }
                if (kua == 1) {
                    kuab = true;
                }
                ins.setIdentificador(identificador);
                ins.setKai(kaib);
                ins.setKua(kuab);
                // Datos de la persona
                int idPersona = r.getInt("id_persona");
                String nombre = r.getString("nom_persona");
                String segNombre = r.getString("segnom_persona");
                String paterno = r.getString("pat_persona");
                String materno = r.getString("mat_persona");
                String sexo = r.getString("sex_persona");
                Date nac = r.getDate("fnac_persona");
                String boleta = r.getString("blta_persona");
                // Datos de la institución
                int idInst = r.getInt("idc_institucion");
                String sigInst = r.getString("sigc_institucion");
                String nomInst = r.getString("sigc_institucion");
                satk.objetos.Institucion inst;
                inst = new satk.objetos.Institucion(idInst, nomInst, sigInst);
                satk.objetos.Persona per;
                per = new satk.objetos.Persona(idPersona, nombre, segNombre, paterno, materno, sexo, nac, boleta, inst);
                //Datos Categoria
                int idCat = r.getInt("idc_categoria");
                String nomCat = r.getString("nomc_categoria");
                String sigCat = r.getString("sigc_categoria");
                satk.objetos.Categoria cat;
                cat = new satk.objetos.Categoria(idCat, nomCat, sigCat);
                //Datos Cinta
                int idCin = r.getInt("idc_cinta");
                String colCin = r.getString("colc_cinta");
                satk.objetos.Cinta cin;
                cin = new satk.objetos.Cinta(idCin, colCin);
                //Datos Peso
                int idPes = r.getInt("idc_peso");
                String pesPes = r.getString("desc_peso");
                satk.objetos.Peso pes;
                pes = new satk.objetos.Peso(idPes, pesPes);

                list.add(ins);
            }
        } catch (SQLException ex) {
            Logger.getLogger(ManagerInstitucion.class.getName()).log(Level.SEVERE,
                    "Error al obtener el registro de Inscripciones", ex);
        } catch (Exception ex) {
            Logger.getLogger(ManagerInstitucion.class.getName()).log(Level.WARNING,
                    "Exepcion desconocida", ex);
        } finally {
            if (list == null || list.size() == 0) {
                list = new LinkedList<Inscripcion>();
            }
            if (!externalCnn) {
                this.closeConexion();
            }
        }
        return list;
    }

    @Override
    public Inscripcion getById(long id) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public int add(Inscripcion o) throws SQLException {
        String query = "INSERT INTO inscripcion_competencia ("
                + " id_persona, idc_institucion, idc_categoria, idc_peso, idc_cinta, kai_inscripcion, kua_inscripcion) "
                + "VALUES (?, ?, ?, ?, ?, ?, ?);";

        DBManager.Prepare parametros = new DBManager.Prepare(2);
        parametros.add(o.getPersona().getIdentificador(), Types.INTEGER);
        parametros.add(o.getInstitucion().getIdentificador(), Types.INTEGER);

        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public int update(Inscripcion o, Inscripcion n) throws java.sql.SQLException {
        throw new UnsupportedOperationException("Sin soporte");
    }

    @Override
    public int remove(Inscripcion o) throws SQLException {
        throw new UnsupportedOperationException("Not supported yet.");
    }
}
